/*
 * @Author: your name
 * @Date: 2021-07-01 09:47:02
 * @LastEditTime: 2021-07-01 19:56:03
 * @LastEditors: Please set LastEditors
 * @Description: In User Settings Edit
 * @FilePath: \vue-hr-project\src\utils\request.js
 */
import axios from 'axios'
import store from '@/store'
import router from '@/router'
import { Message } from 'element-ui'

// create 方法创建一个实例对象
// 1. 接口基地址 baseURL
// 2. 大数处理
// 3. 接口超时  timeout
const service = axios.create({
  // 基地址
  baseURL: process.env.VUE_APP_BASE_API, // url = base url + request url
  // withCredentials: true, // send cookies when cross-domain requests
  // 最大接口请求超时时间
  timeout: 5000 // request timeout
})

// 请求拦截器
// 全局注入token (request headers)
// 好处: 一次配置 多处使用
service.interceptors.request.use(
  config => {
    // console.log(config)
    // 加一个判断语句  如果有token  就设置到请求头中
    // 在这个位置需要统一的去注入token
    if (store.getters.token) {
      // 如果token存在 注入token
      config.headers['Authorization'] = `Bearer ${store.getters.token}`
    }
    return config
  },
  error => {
    return Promise.reject(error)
  }
)

// 响应拦截器
// 1. token 失效 401 跳转到登录页重新登录 / 或者  token 续签(就地把新的token拿到,重新赋值)
service.interceptors.response.use(
  // 判断依据: 根据响应状态码去决定当前走哪个回调函数
  // 2xx 3xx
  response => {
    // 从axios的data中解构出来必要的字段
    const { success, message } = response.data
    if (success) { // 表示请求成功
      return response.data
    } else {
      // 如果success为false 业务出错,直接触发reject 被catch分支捕获
      return Promise.reject(message)
    }
  },
  // 不是  2xx 3xx 都走这里  如  4xx 5xx 等
  error => {
    const code = error.response && error.response.data && error.response.data.code
    if (code === 10002) {
      // 当等于10002的时候 表示 后端告诉我token超时
      // 调用 actions 的函数, 删除token 和用户数据
      store.commit('user/removeToken')
      // 跳转到登录页
      router.push({
        path: 'login',
        redirect: window.location.hash.substring(1)
      })
    } else {
      Message.error(error.message) // 提示错误信息
    }
    return Promise.reject(error)
  }
)

export default service
